JavaScriptã®å¿ é ãšã©ãŒå埩ãã¿ãŒã³ãåŠã³ãŸããã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ãç¿åŸããåé¡çºçæã§ãæ©èœãããå埩åãšUXã«åªããWebã¢ããªãæ§ç¯ããŸãããã
JavaScriptã®ãšã©ãŒå埩ïŒã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³å®è£ ãã¿ãŒã³ã¬ã€ã
Webéçºã®äžçã§ã¯ãç§ãã¡ã¯å®ç§ãç®æããŸããã¯ãªãŒã³ãªã³ãŒããæžããå æ¬çãªãã¹ããè¡ããèªä¿¡ãæã£ãŠãããã€ããŸããããããæåã®åªåã«ãããããããæ®éçãªçå®ãäžã€æ®ã£ãŠããŸããããã¯ãç©äºã¯å£ããããšããããšã§ãããããã¯ãŒã¯æ¥ç¶ã¯äžå®å®ã«ãªããAPIã¯å¿çããªããªãããµãŒãããŒãã£ã®ã¹ã¯ãªããã¯å€±æããäºæãã¬ãŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãç§ãã¡ãäºæ³ã ã«ããªãã£ããšããžã±ãŒã¹ãåŒãèµ·ãããŸããåé¡ã¯ãã¢ããªã±ãŒã·ã§ã³ã§ãšã©ãŒãçºçãããã©ããã§ã¯ãªããçºçãããšãã«ã©ã®ããã«æ¯ãèããã§ãã
çã£çœãªç»é¢ãæ°žé ã«å転ããããŒããŒããããã¯äžå¯è§£ãªãšã©ãŒã¡ãã»ãŒãžã¯ãåãªããã°ä»¥äžã®ãã®ã§ããããã¯ãŠãŒã¶ãŒãšã®ä¿¡é Œé¢ä¿ã®äŸµå®³ã§ããããã§ãã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ã®å®è·µããããã®éçºè ã«ãšã£ãŠéèŠãªã¹ãã«ãšãªããŸããããã¯ãçæ³çãªæ¡ä»¶äžã§æ©èœããã ãã§ãªããäžéšã倱æããŠãå埩åããããå©çšå¯èœãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããæè¡ã§ãã
ãã®å æ¬çãªã¬ã€ãã§ã¯ãJavaScriptã«ãããã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ã®ããã®å®è·µçã§å®è£ ã«çŠç¹ãåœãŠããã¿ãŒã³ãæ¢æ±ããŸããåºæ¬çãª`try...catch`ãè¶ ããŠãããžã¿ã«ç°å¢ãã©ã®ãããªå°é£ãæããããŠããŠããã¢ããªã±ãŒã·ã§ã³ããŠãŒã¶ãŒã«ãšã£ãŠä¿¡é Œã§ããããŒã«ã§ããç¶ããããšãä¿èšŒããæŠç¥ãæãäžããŠãããŸãã
ã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ vs. ããã°ã¬ãã·ãã»ãšã³ãã³ã¹ã¡ã³ãïŒéèŠãªéã
ãã¿ãŒã³ã«é£ã³èŸŒãåã«ãããããæ··ä¹±ç¹ãæç¢ºã«ããŠããããšãéèŠã§ããã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ãšããã°ã¬ãã·ãã»ãšã³ãã³ã¹ã¡ã³ãã¯ããã°ãã°äžç·ã«èšåãããŸãããåãã³ã€ã³ã®è£è¡šã§ãããå€åæ§ã®åé¡ã«éã®æ¹åããã¢ãããŒãããŸãã
- ããã°ã¬ãã·ãã»ãšã³ãã³ã¹ã¡ã³ãïŒ ãã®æŠç¥ã¯ããã¹ãŠã®ãã©ãŠã¶ã§æ©èœããã³ã¢ã³ã³ãã³ããšæ©èœã®ããŒã¹ã©ã€ã³ããå§ãŸããŸããæ¬¡ã«ããããããµããŒãã§ãããã©ãŠã¶ã®ããã«ãããé«åºŠãªæ©èœãšè±ããªäœéšã®å±€ãäžã«è¿œå ããŠãããŸããããã¯æ¥œèгçã§ããã ã¢ããã®ã¢ãããŒãã§ãã
- ã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ïŒ ãã®æŠç¥ã¯ãå®å šã§æ©èœè±å¯ãªäœéšããå§ãŸããŸããæ¬¡ã«ãç¹å®ã®æ©èœãAPIããŸãã¯ãªãœãŒã¹ãå©çšã§ããªãããããã¯å£ããå Žåã«åããŠããã©ãŒã«ããã¯ãä»£æ¿æ©èœãæäŸããããšã§ãé害ã«åããŸããããã¯å®çšçã§ãå埩åã«çŠç¹ãåœãŠããããããŠã³ã®ã¢ãããŒãã§ãã
ãã®èšäºã§ã¯ãã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ãã€ãŸãé害ãäºæž¬ããã¢ããªã±ãŒã·ã§ã³ã厩å£ããªãããã«ããé²åŸ¡çãªè¡çºã«çŠç¹ãåœãŠãŸããçã«å ç¢ãªã¢ããªã±ãŒã·ã§ã³ã¯äž¡æ¹ã®æŠç¥ãæ¡çšããŸããããã°ã©ããŒã·ã§ã³ãç¿åŸããããšã¯ãWebã®äºæž¬äžå¯èœãªæ§è³ªã«å¯ŸåŠããéµãšãªããŸãã
JavaScriptãšã©ãŒã®å šäœåãçè§£ãã
ãšã©ãŒã广çã«åŠçããããã«ã¯ããŸããã®åå ãçè§£ããå¿ èŠããããŸããããã³ããšã³ãã®ãšã©ãŒã®ã»ãšãã©ã¯ãããã€ãã®äž»èŠãªã«ããŽãªã«åé¡ãããŸãïŒ
- ãããã¯ãŒã¯ãšã©ãŒïŒ ãããã¯æãäžè¬çãªãã®ã®äžã€ã§ããAPIãšã³ããã€ã³ããããŠã³ããŠããããŠãŒã¶ãŒã®ã€ã³ã¿ãŒãããæ¥ç¶ãäžå®å®ã§ããããªã¯ãšã¹ããã¿ã€ã ã¢ãŠãããããšãã£ãããšãèããããŸãã倱æãã`fetch()`åŒã³åºããå žåçãªäŸã§ãã
- ã©ã³ã¿ã€ã ãšã©ãŒïŒ ãããã¯ããªãèªèº«ã®JavaScriptã³ãŒãå ã®ãã°ã§ããäžè¬çãªåå ã«ã¯ã`TypeError`ïŒäŸïŒ`Cannot read properties of undefined`ïŒã`ReferenceError`ïŒäŸïŒååšããªã倿°ãžã®ã¢ã¯ã»ã¹ïŒããŸãã¯ççŸããç¶æ ã«ã€ãªããããžãã¯ãšã©ãŒãªã©ããããŸãã
- ãµãŒãããŒãã£ã¹ã¯ãªããã®å€±æïŒ çŸä»£ã®Webã¢ããªã¯ãåæãåºåãã«ã¹ã¿ããŒãµããŒããŠã£ãžã§ãããªã©ã®ããã«ã倿°ã®å€éšã¹ã¯ãªããã«äŸåããŠããŸãããããã®ã¹ã¯ãªããã®äžã€ãèªã¿èŸŒã¿ã«å€±æãããããã°ãå«ãã§ããããããšãã¬ã³ããªã³ã°ããããã¯ããããã¢ããªã±ãŒã·ã§ã³å šäœãã¯ã©ãã·ã¥ããããšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã
- ç°å¢/ãã©ãŠã¶ã®åé¡ïŒ ãŠãŒã¶ãŒãç¹å®ã®Web APIããµããŒãããŠããªãå€ããã©ãŠã¶ã䜿çšããŠããå Žåãããã©ãŠã¶æ¡åŒµæ©èœãã¢ããªã±ãŒã·ã§ã³ã®ã³ãŒããšå¹²æžããŠããå ŽåããããŸãã
ãããã®ã«ããŽãªã®ããããã§æªåŠçã®ãšã©ãŒãçºçãããšããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã«ãšã£ãŠå£æ» çãªææãšãªãåŸãŸããã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ã«ãããç§ãã¡ã®ç®æšã¯ããããã®é害ã®ç颚ååŸãå°ã蟌ããããšã§ãã
åºç€ïŒ`try...catch`ã«ããéåæãšã©ãŒãã³ããªã³ã°
`try...catch...finally`ãããã¯ã¯ããšã©ãŒãã³ããªã³ã°ããŒã«ãããã®äžã§æãåºæ¬çãªããŒã«ã§ãããããããã®å€å žçãªå®è£ ã¯åæçãªã³ãŒãã«å¯ŸããŠã®ã¿æ©èœããŸãã
åæçãªäŸïŒ
try {
let data = JSON.parse(invalidJsonString);
// ... ããŒã¿ãåŠç
} catch (error) {
console.error("JSONã®è§£æã«å€±æããŸããïŒ", error);
// ããã§ãã°ã¬ã€ã¹ãã«ã«ãã°ã¬ãŒããã...
} finally {
// ãã®ã³ãŒãã¯ãšã©ãŒã®æç¡ã«ãããããå®è¡ãããïŒäŸïŒã¯ãªãŒã³ã¢ããã®ããïŒ
}
çŸä»£ã®JavaScriptã§ã¯ãã»ãšãã©ã®I/Oæäœã¯éåæã§ãããäž»ã«Promiseã䜿çšããŸãããããã«å¯ŸããŠã¯ããšã©ãŒããã£ããããããã®äž»èŠãªæ¹æ³ã2ã€ãããŸãã
1. Promiseã®`.catch()`ã¡ãœããïŒ
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => { /* ããŒã¿ã䜿çšãã */ })
.catch(error => {
console.error("APIåŒã³åºãã«å€±æããŸããïŒ", error);
// ããã«ãã©ãŒã«ããã¯ããžãã¯ãå®è£
});
2. `async/await`ãš`try...catch`ïŒ
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTPãšã©ãŒïŒ status: ${response.status}`);
}
const data = await response.json();
// ããŒã¿ã䜿çšãã
} catch (error) {
console.error("ããŒã¿ã®ååŸã«å€±æããŸããïŒ", error);
// ããã«ãã©ãŒã«ããã¯ããžãã¯ãå®è£
}
}
ãããã®åºç€ãç¿åŸããããšããæ¬¡ã«ç¶ãããé«åºŠãªãã¿ãŒã³ãå®è£ ããããã®åææ¡ä»¶ã§ãã
ãã¿ãŒã³1ïŒã³ã³ããŒãã³ãã¬ãã«ã®ãã©ãŒã«ããã¯ïŒãšã©ãŒããŠã³ããªãŒïŒ
ææªã®ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ã®äžã€ã¯ãUIã®éèŠã§ãªãå°ããªéšåã倱æããã¢ããªã±ãŒã·ã§ã³å šäœãéé£ãã«ããŠããŸãããšã§ãã解決çã¯ã³ã³ããŒãã³ããåé¢ããäžã€ã®ãšã©ãŒãé£éããŠä»ã®ãã¹ãŠãã¯ã©ãã·ã¥ãããªãããã«ããããšã§ãããã®æŠå¿µã¯ãReactã®ãããªãã¬ãŒã ã¯ãŒã¯ã§ããšã©ãŒããŠã³ããªãŒããšããŠæåã«å®è£ ãããŠããŸãã
ãããããã®ååã¯æ®éçã§ãïŒåã ã®ã³ã³ããŒãã³ãããšã©ãŒãã³ããªã³ã°å±€ã§ã©ãããããããã³ã³ããŒãã³ããã¬ã³ããªã³ã°äžãã©ã€ããµã€ã¯ã«äžã«ãšã©ãŒãã¹ããŒããå ŽåãããŠã³ããªãŒãããããã£ãããã代ããã«ãã©ãŒã«ããã¯UIã衚瀺ããŸãã
Vanilla JavaScriptã§ã®å®è£
ä»»æã®UIã³ã³ããŒãã³ãã®ã¬ã³ããªã³ã°ããžãã¯ãã©ããããç°¡åãªé¢æ°ãäœæã§ããŸãã
function createErrorBoundary(componentElement, renderFunction) {
try {
// ã³ã³ããŒãã³ãã®ã¬ã³ããŒããžãã¯ãå®è¡ããããšè©Šã¿ã
renderFunction();
} catch (error) {
console.error(`ã³ã³ããŒãã³ãã®ãšã©ãŒïŒ${componentElement.id}`, error);
// ã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ïŒãã©ãŒã«ããã¯UIãã¬ã³ããªã³ã°ãã
componentElement.innerHTML = `<div class="error-fallback">
<p>ç³ãèš³ãããŸããããã®ã»ã¯ã·ã§ã³ã¯èªã¿èŸŒããŸããã§ããã</p>
</div>`;
}
}
䜿çšäŸïŒå€©æ°ãŠã£ãžã§ãã
ããŒã¿ãååŸããããŸããŸãªçç±ã§å€±æããå¯èœæ§ã®ãã倩æ°ãŠã£ãžã§ããããããšããŸãã
const weatherWidget = document.getElementById('weather-widget');
createErrorBoundary(weatherWidget, () => {
// ãªãªãžãã«ã®ãæœåšçã«è匱ãªã¬ã³ããªã³ã°ããžãã¯
const weatherData = getWeatherData(); // ããã¯ãšã©ãŒãã¹ããŒãããããããªã
if (!weatherData) {
throw new Error("倩æ°ããŒã¿ãå©çšã§ããŸããã");
}
weatherWidget.innerHTML = `<h3>çŸåšã®å€©æ°</h3><p>${weatherData.temp}°C</p>`;
});
ãã®ãã¿ãŒã³ã䜿çšãããšã`getWeatherData()`ã倱æããå Žåãã¹ã¯ãªããã®å®è¡ã忢ãã代ããã«ããŠãŒã¶ãŒã¯ãŠã£ãžã§ããã®ä»£ããã«äžå¯§ãªã¡ãã»ãŒãžãç®ã«ããã¢ããªã±ãŒã·ã§ã³ã®ä»ã®éšåïŒã¡ã€ã³ã®ãã¥ãŒã¹ãã£ãŒããããã²ãŒã·ã§ã³ãªã©ïŒã¯å®å šã«æ©èœãç¶ããŸãã
ãã¿ãŒã³2ïŒãã£ãŒãã£ãŒãã©ã°ã«ããæ©èœã¬ãã«ã®ãã°ã©ããŒã·ã§ã³
ãã£ãŒãã£ãŒãã©ã°ïŒãŸãã¯ãã°ã«ïŒã¯ãæ°æ©èœã段éçã«ãªãªãŒã¹ããããã®åŒ·åãªããŒã«ã§ãããããã¯ãŸãããšã©ãŒå埩ã®ããã®åªããã¡ã«ããºã ãšããŠãæ©èœããŸããæ°ãããŸãã¯è€éãªæ©èœããã©ã°ã§ã©ããããããšã«ãããæ¬çªç°å¢ã§åé¡ãåŒãèµ·ããå§ããå Žåã«ãã¢ããªã±ãŒã·ã§ã³å šäœãåãããã€ããããšãªãããªã¢ãŒãã§ãããç¡å¹ã«ããæ©èœãåŸãããšãã§ããŸãã
ãšã©ãŒå埩ã«ãããä»çµã¿ïŒ
- ãªã¢ãŒãèšå®ïŒ ã¢ããªã±ãŒã·ã§ã³ã¯èµ·åæã«ããã¹ãŠã®ãã£ãŒãã£ãŒãã©ã°ã®ã¹ããŒã¿ã¹ãå«ãèšå®ãã¡ã€ã«ïŒäŸïŒ`{"isLiveChatEnabled": true, "isNewDashboardEnabled": false}`ïŒãååŸããŸãã
- æ¡ä»¶ä»ãåæåïŒ ã³ãŒãã¯æ©èœãåæåããåã«ãã©ã°ããã§ãã¯ããŸãã
- ããŒã«ã«ãã©ãŒã«ããã¯ïŒ ããã`try...catch`ãããã¯ãšçµã¿åãããããšã§ãå ç¢ãªããŒã«ã«ãã©ãŒã«ããã¯ãå®çŸã§ããŸããæ©èœã®ã¹ã¯ãªããã®åæåã«å€±æããå Žåããã©ã°ããªãã§ãããã®ããã«æ±ãããšãã§ããŸãã
äŸïŒæ°ããã©ã€ããã£ããæ©èœ
// ãµãŒãã¹ããååŸãããã£ãŒãã£ãŒãã©ã°
const featureFlags = { isLiveChatEnabled: true };
function initializeChat() {
if (featureFlags.isLiveChatEnabled) {
try {
// ãã£ãããŠã£ãžã§ããã®è€éãªåæåããžãã¯
const chatSDK = new ThirdPartyChatSDK({ apiKey: '...' });
chatSDK.render('#chat-container');
} catch (error) {
console.error("ã©ã€ããã£ããSDKã®åæåã«å€±æããŸããã", error);
// ã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ïŒä»£ããã«ããåãåããããªã³ã¯ã衚瀺
document.getElementById('chat-container').innerHTML =
'<a href="/contact">ãå°ãã§ããïŒãåãåããã¯ãã¡ã</a>';
}
}
}
ãã®ã¢ãããŒãã¯2å±€ã®é²åŸ¡ãæäŸããŸãããããã€åŸã«ãã£ããSDKã§é倧ãªãã°ãæ€åºããå Žåãèšå®ãµãŒãã¹ã§`isLiveChatEnabled`ãã©ã°ã`false`ã«åãæ¿ããã ãã§ããã¹ãŠã®ãŠãŒã¶ãŒãå³åº§ã«å£ããæ©èœã®èªã¿èŸŒã¿ã忢ããŸããããã«ãäžäººã®ãŠãŒã¶ãŒã®ãã©ãŠã¶ãSDKã«åé¡ãæ±ããŠããå Žåã§ãã`try...catch`ã圌ãã®äœéšãåçŽãªé£çµ¡å ãªã³ã¯ãžãšåªé ã«ãã°ã¬ãŒããããå®å šãªãµãŒãã¹ä»å ¥ãªãã«å¯Ÿå¿ããŸãã
ãã¿ãŒã³3ïŒããŒã¿ãšAPIã®ãã©ãŒã«ããã¯
ã¢ããªã±ãŒã·ã§ã³ã¯APIããã®ããŒã¿ã«å€§ããäŸåããŠãããããããŒã¿ååŸã¬ã€ã€ãŒã§ã®å ç¢ãªãšã©ãŒãã³ããªã³ã°ã¯äº€æžã®äœå°ããããŸãããAPIåŒã³åºãã倱æãããšããå£ããç¶æ ã衚瀺ããã®ã¯ææªã®éžæè¢ã§ãã代ããã«ããããã®æŠç¥ãæ€èšããŠãã ããã
ãµããã¿ãŒã³ïŒå€ã/ãã£ãã·ã¥ãããããŒã¿ã®äœ¿çš
æ°é®®ãªããŒã¿ãååŸã§ããªãå Žåãæ¬¡ã«è¯ãã®ã¯å°ãå€ãããŒã¿ã§ããããšãå€ãã§ãã`localStorage`ããµãŒãã¹ã¯ãŒã«ãŒã䜿çšããŠãæåããAPIã¬ã¹ãã³ã¹ããã£ãã·ã¥ã§ããŸãã
async function getAccountDetails() {
const cacheKey = 'accountDetailsCache';
try {
const response = await fetch('/api/account');
const data = await response.json();
// æåããã¬ã¹ãã³ã¹ãã¿ã€ã ã¹ã¿ã³ãä»ãã§ãã£ãã·ã¥ãã
localStorage.setItem(cacheKey, JSON.stringify({ data, timestamp: Date.now() }));
return data;
} catch (error) {
console.warn("APIã®ååŸã«å€±æããŸããããã£ãã·ã¥ã®äœ¿çšã詊ã¿ãŸãã");
const cached = localStorage.getItem(cacheKey);
if (cached) {
// éèŠïŒããŒã¿ãã©ã€ãã§ã¯ãªãããšããŠãŒã¶ãŒã«éç¥ããïŒ
showToast("ãã£ãã·ã¥ãããããŒã¿ã衚瀺ããŠããŸããææ°æ
å ±ã¯ååŸã§ããŸããã§ããã");
return JSON.parse(cached).data;
}
// ãã£ãã·ã¥ããªãå Žåã¯ããšã©ãŒãããã«äžäœã§åŠçããããã«ã¹ããŒããå¿
èŠããã
throw new Error("APIãšãã£ãã·ã¥ã®äž¡æ¹ãå©çšã§ããŸããã");
}
}
ãµããã¿ãŒã³ïŒããã©ã«ããŸãã¯ã¢ãã¯ããŒã¿
éèŠã§ãªãUIèŠçŽ ã«ã€ããŠã¯ããšã©ãŒã空çœã衚瀺ããããããããã©ã«ãã®ç¶æ ã衚瀺ããæ¹ãè¯ãå ŽåããããŸããããã¯ãããŒãœãã©ã€ãºãããæšå¥šäºé ãæè¿ã®ã¢ã¯ãã£ããã£ãã£ãŒãã®ãããªãã®ã«ç¹ã«åœ¹ç«ã¡ãŸãã
async function getRecommendedProducts() {
try {
const response = await fetch('/api/recommendations');
return await response.json();
} catch (error) {
console.error("æšå¥šäºé
ã®ååŸã«å€±æããŸããã", error);
// äžè¬çã§ããŒãœãã©ã€ãºãããŠããªããªã¹ãã«ãã©ãŒã«ããã¯ãã
return [
{ id: 'p1', name: 'ãã¹ãã»ã©ãŒååA' },
{ id: 'p2', name: '人æ°ååB' }
];
}
}
ãµããã¿ãŒã³ïŒææ°ããã¯ãªãä»ãAPIãªãã©ã€ããžãã¯
ãããã¯ãŒã¯ãšã©ãŒã¯äžæçãªãã®ã§ããããšããããŸããåçŽãªãªãã©ã€ã§åé¡ã解決ããããšããããŸããããããããã«ãªãã©ã€ãããšãåé¡ãæ±ããŠãããµãŒããŒã«éå°ãªè² è·ããããå¯èœæ§ããããŸãããã¹ããã©ã¯ãã£ã¹ã¯ããææ°ããã¯ãªããã䜿çšããããšã§ããããã¯ããªãã©ã€ããšã«åŸ æ©æéãåŸã ã«é·ãããŠããæ¹æ³ã§ãã
async function fetchWithRetry(url, options, retries = 3, delay = 1000) {
try {
return await fetch(url, options);
} catch (error) {
if (retries > 0) {
console.log(`${delay}msåŸã«ãªãã©ã€ããŸã... (æ®ããªãã©ã€åæ° ${retries}å)`);
await new Promise(resolve => setTimeout(resolve, delay));
// æ¬¡ã®æœåšçãªãªãã©ã€ã®ããã«é
å»¶ã2åã«ãã
return fetchWithRetry(url, options, retries - 1, delay * 2);
} else {
// ãã¹ãŠã®ãªãã©ã€ã倱æãããããæçµçãªãšã©ãŒãã¹ããŒãã
throw new Error("è€æ°åã®ãªãã©ã€ã®åŸãAPIãªã¯ãšã¹ãã«å€±æããŸããã");
}
}
}
ãã¿ãŒã³4ïŒNullãªããžã§ã¯ããã¿ãŒã³
`TypeError`ã®é »ç¹ãªåå ã¯ã`null`ãŸãã¯`undefined`ã®ããããã£ã«ã¢ã¯ã»ã¹ããããšããããšã§ããããã¯ãAPIããåãåãããšãæåŸ ããŠãããªããžã§ã¯ãã®èªã¿èŸŒã¿ã«å€±æãããšãã«ããçºçããŸããNullãªããžã§ã¯ããã¿ãŒã³ã¯ãæåŸ ãããã€ã³ã¿ãŒãã§ãŒã¹ã«æºæ ãã€ã€ãäžç«çã§äœãããªãïŒno-opïŒæ¯ãèããæã€ç¹å¥ãªãªããžã§ã¯ããè¿ãããšã§ããã®åé¡ã解決ããå€å žçãªãã¶ã€ã³ãã¿ãŒã³ã§ãã
颿°ã`null`ãè¿ã代ããã«ãããã䜿çšããã³ãŒããå£ããªãããã©ã«ãã®ãªããžã§ã¯ããè¿ããŸãã
äŸïŒãŠãŒã¶ãŒãããã£ãŒã«
Nullãªããžã§ã¯ããã¿ãŒã³ãªãïŒè匱ïŒïŒ
async function getUser(id) {
try {
// ... ãŠãŒã¶ãŒãååŸ
return user;
} catch (error) {
return null; // ããã¯å±éºã§ãïŒ
}
}
const user = await getUser(123);
// getUserã倱æãããšããã㯠"TypeError: Cannot read properties of null (reading 'name')" ãã¹ããŒããŸã
document.getElementById('welcome-banner').textContent = `ããããã${user.name}ããïŒ`;
Nullãªããžã§ã¯ããã¿ãŒã³ããïŒå埩åãããïŒïŒ
const createGuestUser = () => ({
name: 'ã²ã¹ã',
isLoggedIn: false,
permissions: [],
getAvatarUrl: () => '/images/default-avatar.png'
});
async function getUser(id) {
try {
const response = await fetch(`/api/users/${id}`);
if (!response.ok) return createGuestUser();
return await response.json();
} catch (error) {
return createGuestUser(); // 倱ææã«ã¯ããã©ã«ããªããžã§ã¯ããè¿ã
}
}
const user = await getUser(123);
// ãã®ã³ãŒãã¯APIåŒã³åºãã倱æããŠãå®å
šã«åäœããŸãã
document.getElementById('welcome-banner').textContent = `ããããã${user.name}ããïŒ`;
if (!user.isLoggedIn) { /* ãã°ã€ã³ãã¿ã³ã衚瀺 */ }
ãã®ãã¿ãŒã³ã¯ã`null`ãã§ãã¯ïŒ`if (user && user.name)`ïŒã ããã«ãªãå¿ èŠããªããªããããå©çšåŽã®ã³ãŒããéåžžã«åçŽåããŸãã
ãã¿ãŒã³5ïŒéžæçãªæ©èœã®ç¡å¹å
æ©èœå šäœã¯åäœããŠãããã®ã®ããã®äžã®ç¹å®ã®ãµãæ©èœã倱æãããããµããŒããããŠããªãã£ããããããšããããŸããæ©èœå šäœãç¡å¹ã«ãã代ããã«ãåé¡ã®ããéšåã ããå€ç§æè¡çã«ç¡å¹ã«ããããšãã§ããŸãã
ããã¯ãã°ãã°æ©èœæ€åºã«é¢é£ããŠããŸããã€ãŸãããã©ãŠã¶APIãå©çšå¯èœãã©ããããããã䜿çšããããšããåã«ãã§ãã¯ããããšã§ãã
äŸïŒãªããããã¹ããšãã£ã¿
ç»åãã¢ããããŒããããã¿ã³ãããããã¹ããšãã£ã¿ãæ³åããŠãã ããããã®ãã¿ã³ã¯ç¹å®ã®APIãšã³ããã€ã³ãã«äŸåããŠããŸãã
// ãšãã£ã¿ã®åæåäž
const imageUploadButton = document.getElementById('image-upload-btn');
fetch('/api/upload-status')
.then(response => {
if (!response.ok) {
// ã¢ããããŒããµãŒãã¹ãããŠã³ããŠããããã¿ã³ãç¡å¹ã«ããã
imageUploadButton.disabled = true;
imageUploadButton.title = 'ç»åã®ã¢ããããŒãã¯äžæçã«å©çšã§ããŸããã';
}
})
.catch(() => {
// ãããã¯ãŒã¯ãšã©ãŒãåæ§ã«ç¡å¹ã«ããã
imageUploadButton.disabled = true;
imageUploadButton.title = 'ç»åã®ã¢ããããŒãã¯äžæçã«å©çšã§ããŸããã';
});
ãã®ã·ããªãªã§ã¯ããŠãŒã¶ãŒã¯äŸç¶ãšããŠããã¹ããæžãããããã©ãŒãããããããäœæ¥ãä¿åãããããšãã£ã¿ã®ä»ã®ãã¹ãŠã®æ©èœã䜿çšã§ããŸããçŸåšå£ããŠããæ©èœã®äžéšåã ããåãé€ãããšã§ãããŒã«ã®äžå¿çãªæçšæ§ãç¶æãã€ã€ãäœéšãåªé ã«ãã°ã¬ãŒããããŸããã
ããäžã€ã®äŸã¯ããã©ãŠã¶ã®æ©èœã確èªããããšã§ãïŒ
const copyButton = document.getElementById('copy-text-btn');
if (!navigator.clipboard || !navigator.clipboard.writeText) {
// Clipboard APIããµããŒããããŠããªãããã¿ã³ãé衚瀺ã«ããã
copyButton.style.display = 'none';
} else {
// ã€ãã³ããªã¹ããŒãã¢ã¿ãããã
copyButton.addEventListener('click', copyTextToClipboard);
}
ãã®ã³ã°ãšã¢ãã¿ãªã³ã°ïŒå埩ã®åºç€
ååšãç¥ããªããšã©ãŒããåªé ã«ãã°ã¬ãŒãããããšã¯ã§ããŸãããäžèšã§èª¬æãããã¹ãŠã®ãã¿ãŒã³ã¯ãå ç¢ãªãã®ã³ã°æŠç¥ãšçµã¿åãããã¹ãã§ãã`catch`ãããã¯ãå®è¡ããããšãããŠãŒã¶ãŒã«ãã©ãŒã«ããã¯ã衚瀺ããã ãã§ã¯äžååã§ãããšã©ãŒããªã¢ãŒããµãŒãã¹ã«èšé²ããŠãããŒã ãåé¡ã«æ°ä»ããããã«ããªããã°ãªããŸããã
ã°ããŒãã«ãšã©ãŒãã³ãã©ãŒã®å®è£
çŸä»£ã®ã¢ããªã±ãŒã·ã§ã³ã¯ãå°çšã®ãšã©ãŒç£èŠãµãŒãã¹ïŒSentryãLogRocketãDatadogãªã©ïŒã䜿çšãã¹ãã§ãããããã®ãµãŒãã¹ã¯çµ±åã容æã§ãåçŽãª`console.error`ãããã¯ããã«å€ãã®ã³ã³ããã¹ããæäŸããŸãã
ãŸããç¹å®ã®`try...catch`ãããã¯ãããæãããšã©ãŒããã£ããããããã«ãã°ããŒãã«ãã³ãã©ãŒãå®è£ ãã¹ãã§ãã
// åæãšã©ãŒãšæªåŠçã®äŸå€çš
window.onerror = function(message, source, lineno, colno, error) {
// ãã®ããŒã¿ããã®ã³ã°ãµãŒãã¹ã«éä¿¡ãã
ErrorLoggingService.log({
message,
source,
lineno,
stack: error ? error.stack : null
});
// ããã©ã«ãã®ãã©ãŠã¶ãšã©ãŒãã³ããªã³ã°ïŒäŸïŒã³ã³ãœãŒã«ã¡ãã»ãŒãžïŒãé²ãããã«trueãè¿ã
return true;
};
// æªåŠçã®PromiseæåŠçš
window.addEventListener('unhandledrejection', event => {
ErrorLoggingService.log({
reason: event.reason.message,
stack: event.reason.stack
});
});
ãã®ã¢ãã¿ãªã³ã°ã¯ãéèŠãªãã£ãŒãããã¯ã«ãŒããçã¿åºããŸããããã«ãããã©ã®ãã°ã©ããŒã·ã§ã³ãã¿ãŒã³ãæãé »ç¹ã«ããªã¬ãŒãããŠãããã確èªã§ããæ ¹æ¬çãªåé¡ã®ä¿®æ£ãåªå é äœä»ãããæéããããŠããã«å埩åã®ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã®ã«åœ¹ç«ã¡ãŸãã
çµè«ïŒå埩åã®æåãç¯ã
ã°ã¬ã€ã¹ãã«ã»ãã°ã©ããŒã·ã§ã³ã¯ãåãªãã³ãŒãã£ã³ã°ãã¿ãŒã³ã®éãŸã以äžã®ãã®ã§ãããäžçš®ã®èãæ¹ã§ããããã¯é²åŸ¡çããã°ã©ãã³ã°ã®å®è·µã§ããã忣ã·ã¹ãã ã®åºæã®è匱æ§ãèªããäœããããŠãŒã¶ãŒã®äœéšãåªå ããããšã§ãã
åçŽãª`try...catch`ãè¶ ããå€å±€çãªæŠç¥ãåãå ¥ããããšã§ãã¹ãã¬ã¹äžã§ã®ã¢ããªã±ãŒã·ã§ã³ã®æ¯ãèããå€é©ã§ããŸããæåã®ãã©ãã«ã®å åã§ç²ã ã«ãªãèãã·ã¹ãã ã§ã¯ãªããåé¡ãçºçããŠãäžæ žçãªäŸ¡å€ãç¶æãããŠãŒã¶ãŒã®ä¿¡é Œãä¿ã€ãå埩åã®ããé©å¿å¯èœãªäœéšãåµé ããã®ã§ãã
ãŸããã¢ããªã±ãŒã·ã§ã³ã§æãéèŠãªãŠãŒã¶ãŒãžã£ãŒããŒãç¹å®ããããšããå§ããŸããããã©ãã§ãšã©ãŒãæãæå®³ãããããã§ããããïŒããã«ãããã®ãã¿ãŒã³ãæåã«é©çšããŠãã ããïŒ
- ãšã©ãŒããŠã³ããªãŒã§ã³ã³ããŒãã³ããåé¢ããã
- ãã£ãŒãã£ãŒãã©ã°ã§æ©èœãå¶åŸ¡ããã
- ãã£ãã·ã³ã°ãããã©ã«ãå€ããªãã©ã€ã§ããŒã¿ã®å€±æãäºæž¬ããã
- Nullãªããžã§ã¯ããã¿ãŒã³ã§åãšã©ãŒã鲿¢ããã
- æ©èœå šäœã§ã¯ãªããå£ããŠãããã®ã ããç¡å¹ã«ããã
- åžžã«ããã¹ãŠãç£èŠããã
倱æã®ããã«æ§ç¯ããããšã¯æ²èгçã§ã¯ãããŸãããããã¯ãããã§ãã·ã§ãã«ãªããšã§ãããããããŠãŒã¶ãŒãå€ããå ç¢ã§ãä¿¡é Œæ§ããããæ¬æã®ããã£ãWebã¢ããªã±ãŒã·ã§ã³ãç§ãã¡ãæ§ç¯ããæ¹æ³ãªã®ã§ãã